home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
os2
/
plnk081.zip
/
pilot-link.0.8.1
/
scripts
/
struct.pl
< prev
next >
Wrap
Perl Script
|
1997-05-23
|
5KB
|
191 lines
#!/usr/bin/perl
#
# Copyright (c) 1997, Kenneth Albanowksi
#
# Licensed under GPL v2.
# Turn struct definition into portable set of access routines
$example = "
/* begin struct xyz
* Char aa
* Word a
* DWord b
* SWord c
* Char[foo][bar] d
* Byte e
* DWord[5][bar] e2
* DWord[5][5] e2
* Char[5] f
* Char[0] g
* struct access */
#define get_name_a(ptr) get_short(ptr)
#define get_name_b(ptr) get_long(ptr+2)
#define get_name_c(ptr) get_sshort(ptr+6)
#define ptr_name_d(ptr) ptr+8
#define get_name_d(ptr,idx)
#define sizeof_name 28
/* end struct xyz */
/* begin struct abc
* Char a
* Char b
* Char c
* Word d
* end struct abc
*/
/* begin struct abc
* Char a
* Char b
* Char c
* Word d
* struct access */
/* struct offsets */
* end struct abc */
";
%sizes = ( Word => 2, SWord => -2, DWord => 4, SDWord => -4, CharPtr => 4,
Char => 1, Boolean => 1, Byte => 1, Handle => 4, Ptr => 4,
DlpDateTimeType => 8);
%access = ( 1 => "byte", 2 => "short", 3 => "treble", 4 => "long",
-1 => "sbyte", -2 => "sshort", -3 => "streble", -4 => "slong",
8 => "date");
$items = undef;
$name = undef;
while(<>) {
if (m!^\s*/\*\s*begin\s+struct\s+(\S+)!) {
$name = $1;
@e=();
$pos = "0";
$npos = 0;
$items = $name;
print;
} elsif (defined $name and m!/*\s*end\s+struct\s+$endname!) {
print;
$name = undef;
$items = undef;
} elsif (defined $name and m!\*\s*\s+struct\s+access\s*\*/!) {
$pos = "0";
$npos = 0;
print;
foreach (@e) {
my($pos, $type,$array,$item) = @$_;
my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
if ($array) {
my(@array) = @$array;
my($offset) = join("*",$size,@array[1..$#array]);
print "#define get_${name}_$item(ptr,idx) get_$access((ptr)+$pos+$offset*(idx))\n";
print "#define set_${name}_$item(ptr,idx,val) set_$access((ptr)+$pos+$offset*(idx),(val))\n";
print "#define ptr_${name}_$item(ptr,idx) ((ptr)+$pos+$offset*(idx))\n";
} else {
print "#define get_${name}_$item(ptr) get_$access((ptr)+$pos)\n";
print "#define set_${name}_$item(ptr,val) set_$access((ptr)+$pos,(val))\n";
}
}
print "#define sizeof_$name ($len)\n";
$items = undef;
} elsif (defined $name and m!\*\s*struct\s+offsets\s*\*/!) {
$pos = "0";
$npos = 0;
print;
foreach (@e) {
my($pos, $type,$array,$item) = @$_;
my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
print "#define ${name}_$item ($pos)\n";
}
print "#define sizeof_$name ($len)\n";
$items = undef;
} elsif (defined $name and m!\*\s*struct\s+read\s+access\s*\*/!) {
$pos = "0";
$npos = 0;
print;
foreach (@e) {
my($pos, $type,$array,$item) = @$_;
my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
if ($array) {
my(@array) = @$array;
my($offset) = join("*",$size,@array[1..$#array]);
print "#define ${name}_$item(ptr,idx) get_$access((ptr)+$pos+$offset*(idx))\n";
print "#define ptr_${name}_$item(ptr,idx) ((ptr)+$pos+$offset*(idx))\n";
} else {
print "#define ${name}_$item(ptr) get_$access((ptr)+$pos)\n";
}
}
print "#define sizeof_$name ($len)\n";
$items = undef;
} elsif (defined $name and m!\*\s*struct\s+write\s+access\s*\*/!) {
$pos = "0";
$npos = 0;
print;
foreach (@e) {
my($pos, $type,$array,$item) = @$_;
my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
if ($array) {
my(@array) = @$array;
my($offset) = join("*",$size,@array[1..$#array]);
print "#define ${name}_$item(ptr,idx,val) set_$access((ptr)+$pos+$offset*(idx),(val))\n";
print "#define ptr_${name}_$item(ptr,idx) ((ptr)+$pos+$offset*(idx))\n";
} else {
print "#define ${name}_$item(ptr,val) set_$access((ptr)+$pos,(val))\n";
}
}
print "#define sizeof_$name ($len)\n";
$items = undef;
} elsif (defined $items and m!^\s*\*\s+(\S+?)((\[\S+?\])*)\s+(\S+)!) {
my($type,$array,$name) = ($1,$2,$4);
my(@array);
push @array, $1 while $array =~ m/\[(.*?)\]/g;
my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
if ($size>1 and $npos & 1) {
$pos =~ s/(\*\d+)$/$1+0/;
$pos =~ s/(\d+)$/$1+1/e;
$npos++;
}
push @e, [$pos, $type, (@array ? \@array : undef),$name];
s/([ \t]*)(\S+\(.*?\))?\s*$/(length($1) ? $1 : "\t\t") . "$access($pos)\n"/e;
if (@array) {
my($offset) = join("*",$size,@array[1..$#array]);
#$pos .= "+" . ;
$x = $size;
$textpos = 0;
foreach (@array) {
$x *= $_;
if (/\D/) {
$textpos = 1;
}
}
if ($textpos) {
$pos .= "+" .join("*", @array, $size);
$npos += 0;
} else {
$pos =~ s/(\*\d+)$/$1+0/;
$pos =~ s/(\d+)$/$1+$x/e;
$npos += $x;
}
} else {
$s = abs($size);
$pos =~ s/(\*\d+)$/$1+$s/;
$pos =~ s/(\d+)$/$1+$s/e;
$npos += $s;
}
$len = $pos;
print;
} elsif (defined $name) {
if (m!/\*\s*end\s+struct\s+$endname!) {
print;
$items = undef;
$name= undef;
}
} else {
print;
}
}